Guice Dependency Injection (DI) ফ্রেমওয়ার্কে, কিছু নির্ভরশীলতা optional (ঐচ্ছিক) হতে পারে। এর মানে হল যে, কিছু ডিপেনডেন্সি সরবরাহ করা না-ও হতে পারে বা তাদের ইনজেকশন কনফিগারেশন অনুযায়ী অপশনাল হতে পারে। Guice এই ধরনের পরিস্থিতি optional dependencies হ্যান্ডল করতে বেশ কিছু উপায় প্রদান করে।
এখানে Optional Dependencies হ্যান্ডল করার জন্য বিভিন্ন পদ্ধতির আলোচনা করা হবে, যেমন @Inject, Optional ক্লাস, এবং @Provides মেথডের মাধ্যমে।
1. Guice-এ Optional Dependencies এর জন্য Optional ব্যবহার
Guice java.util.Optional ব্যবহার করে optional dependencies সহজে হ্যান্ডল করতে পারে। Guice স্বয়ংক্রিয়ভাবে Optional ইনজেক্ট করতে পারে যখন একটি ডিপেনডেন্সি ঐচ্ছিক (optional) হয়।
এটি কীভাবে কাজ করে?
Optionalক্লাসটি Java 8 থেকে আসছে এবং এটি একটি nullable ফিল্ড হিসেবে কাজ করে।- যদি একটি ডিপেনডেন্সি মডিউলে
Optional.empty()থাকে, তবে Guice ঐ ডিপেনডেন্সি সরবরাহ করবে না। Optionalডিপেনডেন্সি ইনজেকশনকে null handling থেকে মুক্তি দেয়।
উদাহরণ:
import com.google.inject.Inject;
import java.util.Optional;
public class BillingService {
private final PaymentService paymentService;
private final Optional<DiscountService> discountService; // Optional dependency
@Inject
public BillingService(PaymentService paymentService, Optional<DiscountService> discountService) {
this.paymentService = paymentService;
this.discountService = discountService;
}
public void processPayment() {
paymentService.pay();
discountService.ifPresent(DiscountService::applyDiscount); // If present, apply discount
}
}
interface PaymentService {
void pay();
}
class PaypalPaymentService implements PaymentService {
public void pay() {
System.out.println("Payment made via PayPal.");
}
}
interface DiscountService {
void applyDiscount();
}
class SeasonalDiscountService implements DiscountService {
public void applyDiscount() {
System.out.println("Seasonal discount applied.");
}
}
Guice Module:
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Singleton;
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
bind(PaymentService.class).to(PaypalPaymentService.class); // Mandatory dependency
}
@Provides
@Singleton
public Optional<DiscountService> provideDiscountService() {
return Optional.of(new SeasonalDiscountService()); // Optional dependency
}
}
Usage:
import com.google.inject.Guice;
import com.google.inject.Injector;
public class Main {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new BillingModule());
BillingService billingService = injector.getInstance(BillingService.class);
billingService.processPayment(); // Output: Payment made via PayPal. Seasonal discount applied.
}
}
Explanation:
Optional<DiscountService>ডিপেনডেন্সি ঐচ্ছিক, যদি এটি সরবরাহ করা না হয়, তবে GuiceOptional.empty()ইনজেক্ট করবে এবং কোন ত্রুটি সৃষ্টি হবে না।- যদি
DiscountServiceইনজেক্ট করা হয়, তবেapplyDiscount()কল হবে।
2. Optional Dependencies with @Provides
আপনি Guice-এ @Provides মেথড ব্যবহার করে Optional ডিপেনডেন্সি সরবরাহ করতে পারেন। এখানে একটি উদাহরণ দেওয়া হলো যেখানে একটি ডিপেনডেন্সি কেবল তখনই সরবরাহ করা হয় যদি তা প্রয়োজনীয় হয়।
Example:
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import java.util.Optional;
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
bind(PaymentService.class).to(PaypalPaymentService.class);
}
@Provides
@Singleton
public Optional<DiscountService> provideDiscountService() {
// Return an Optional of DiscountService based on some condition
boolean isDiscountAvailable = checkSeasonalDiscount();
return isDiscountAvailable ? Optional.of(new SeasonalDiscountService()) : Optional.empty();
}
private boolean checkSeasonalDiscount() {
// Dummy logic for seasonal discount availability
return true;
}
}
Explanation:
- এখানে
@ProvidesমেথডেOptional<DiscountService>প্রদান করা হচ্ছে। - যদি
checkSeasonalDiscount()trueফেরত দেয়, তাহলেOptional.of(new SeasonalDiscountService())ফেরত দিবে, অন্যথায়Optional.empty()ফেরত দেবে। - এই ভাবে, Guice
DiscountServiceডিপেনডেন্সিটি ঐচ্ছিকভাবে ইনজেক্ট করবে।
3. Handling Optional Dependencies Using @Inject and Conditional Bindings
এছাড়াও Guice-এ আপনি কিছু কাস্টম লজিক ব্যবহার করে conditional bindings করতে পারেন, যেমন কোনো নির্দিষ্ট অবস্থায় একটি ডিপেনডেন্সি ইনজেক্ট করা অথবা না করা।
Example:
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import java.util.Optional;
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
bind(PaymentService.class).to(PaypalPaymentService.class);
}
@Provides
@Singleton
public Optional<DiscountService> provideDiscountService() {
// If seasonal discount is available, inject DiscountService
boolean isSeasonalDiscount = isSeasonalDiscountAvailable();
return isSeasonalDiscount ? Optional.of(new SeasonalDiscountService()) : Optional.empty();
}
private boolean isSeasonalDiscountAvailable() {
// Logic to check if seasonal discount is available
return true;
}
}
public class BillingService {
private final PaymentService paymentService;
private final Optional<DiscountService> discountService;
@Inject
public BillingService(PaymentService paymentService, Optional<DiscountService> discountService) {
this.paymentService = paymentService;
this.discountService = discountService;
}
public void processPayment() {
paymentService.pay();
discountService.ifPresent(DiscountService::applyDiscount); // Will apply discount if available
}
}
public class Main {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new BillingModule());
BillingService billingService = injector.getInstance(BillingService.class);
billingService.processPayment(); // Output: Payment made via PayPal. Seasonal discount applied.
}
}
Guice Optional Dependencies Summary
Optionalব্যবহার করে, Guice সহজেই optional dependencies হ্যান্ডল করতে পারে।Optional.empty()ব্যবহার করে Guice ঐচ্ছিক ডিপেনডেন্সি ইনজেক্ট না করার পরিস্থিতি হ্যান্ডল করতে পারে।@Providesমেথড এবংOptionalব্যবহার করে কাস্টম লজিক সহ ডিপেনডেন্সি সরবরাহ করা যায়।- Guice ডিপেনডেন্সি ইনজেকশনকে আরও নমনীয় এবং টেস্টযোগ্য করে তোলে, বিশেষ করে ঐচ্ছিক ডিপেনডেন্সি ইনজেকশনের ক্ষেত্রে।
Guice-এর মাধ্যমে optional dependencies সহজে ম্যানেজ করা যায় এবং এই ব্যবস্থাটি কোডের decoupling এবং testability বৃদ্ধি করে।
Read more